package com.baiduspring.utils.io;

import com.baiduspring.utils.date.DateUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Date;

public class FileIO {
    private final static Logger LOGGER = Logger.getLogger(FileIO.class);

    /**
     * 描述：读取提供的文本的内容。
     *
     * @param filename 入参
     * @return　返回文本内容
     */
    public static String readFileContentOfText(String filename) {
        URL url = FileIO.class.getClassLoader().getResource(filename);
        File file = null;
        try {
            file = new File(url.toURI());
        } catch (URISyntaxException e) {

        }

        if (!file.exists()) {
            LOGGER.error("文件不存在");
            return null;
        }

        try {
            return FileUtils.readFileToString(file, "UTF-8");
        } catch (IOException e) {
            LOGGER.error("文件读取异常，错误：", e);
        }
        return null;
    }

    public static void main(String[] args) {
        URL url = FileIO.class.getClassLoader().getResource("");
        System.out.println(url);
    }

    /**
     * <div style="color:green;font-weight: bolder;">
     * <h3>读取文件</h3>
     * &emsp;&emsp;描述：读取提供的文本的内容。
     * </div>
     *
     * @param
     * @return
     * @throws
     * @author xiongyan
     * @date 2016年3月9日上午8:53:55
     */
    public static String content(String filename) {
        InputStream in = FileIO.class.getResourceAsStream(filename);
        if (in == null) {
            try {
                in = new FileInputStream(filename);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
        }
        Reader reader = null;

        StringBuilder builder = new StringBuilder();
        try {
            reader = new InputStreamReader(in, "utf-8");
            char[] c = new char[1024];
            int len = 0;
            while ((len = reader.read(c)) != -1) {
                builder.append(c, 0, len);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                    reader = null;
                }
                if (in != null) {
                    in.close();
                    in = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return builder.toString();
    }

    /**
     * <div style="color:green;font-weight: bolder;">
     * <h3></h3>
     * &emsp;&emsp;描述：创建文件并向其中写入内容
     * </div>
     *
     * @param fileName   文件名，可以为null，如果输入需要写入扩展名，如果未输入需要设置扩展名。
     * @param content    文件内容
     * @param ext        扩展名。如：xml,java,sql
     * @param isReadOnly 是否将文件设置只读。true：只读，false：可读可写
     * @return
     * @throws
     * @author xiongyan
     * @date 2016年3月9日上午8:55:50
     */
    private static File execTouch(String fileName, String content, String ext, boolean isReadOnly) {
        File file = null;
        if (!StringUtils.isEmpty(fileName)) {
            file = new File(fileName);
            if (!file.exists()) {
                try {
                    if (!file.createNewFile()) {
                        throw new RuntimeException("文件创建失败：" + fileName);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            if (StringUtils.isEmpty(ext)) new RuntimeException("扩展名不能为空").printStackTrace();
            else file = new File("default_" + DateUtils.formatDate2String(new Date(), "yyyy-MM-dd") + "." + ext);
        }

        try (
                FileOutputStream out = new FileOutputStream(file, true);
                OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8");
                BufferedWriter bufferedWriter = new BufferedWriter(writer);
        ) {
            bufferedWriter.write(content);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        /**
         * 设置文件为只读
         */
        if (isReadOnly) {
            if (!file.setReadOnly()) {
                new RuntimeException("文件只读权限设置失败").printStackTrace();
                file.deleteOnExit();
            }
            ;
        }

        return file;
    }

    /**
     * <div style="color:green;font-weight: bolder;">
     * <h3></h3>
     * &emsp;&emsp;描述：根据文件名创建文件并向文件中写入数据（文本文件）。jdk必须是1.7或更高的版本。
     * </div>
     *
     * @param fileName 文件名，可以为null，如果输入需要写入扩展名，如果未输入需要设置扩展名。
     * @param content  文件内容
     * @return
     * @throws
     * @author xiongyan
     * @email javadevyan@163.com
     * @date 2016年5月11日上午9:37:14
     */
    public static File touchByFileName(String fileName, String content, boolean isReadOnly) {
        return execTouch(fileName, content, null, isReadOnly);
    }

    /**
     * <div style="color:green;font-weight: bolder;">
     * <h3></h3>
     * &emsp;&emsp;描述：根据文件名创建文件并向文件中写入数据（文本文件）。jdk必须是1.7或更高的版本。
     * </div>
     *
     * @param fileName 文件名，可以为null，如果输入需要写入扩展名，如果未输入需要设置扩展名。
     * @param content  文件内容
     * @return
     * @throws
     * @author xiongyan
     * @email javadevyan@163.com
     * @date 2016年10月15日 下午10:42:25
     */
    public static File touch(String fileName, String content, boolean isReadOnly) {
        return touchByFileName(fileName, content, isReadOnly);
    }

}